Jackson একটি শক্তিশালী লাইব্রেরি যা Java Objects কে JSON এ রূপান্তর (Serialization) এবং JSON থেকে Java Objects তৈরি (Deserialization) করতে সাহায্য করে। Complex Objects, যেমন nested objects, collections, inheritance hierarchies, এবং bidirectional relationships এর ক্ষেত্রে Jackson অ্যানোটেশন ব্যবহার করে নির্ভুলভাবে Serialization এবং Deserialization করা যায়।
এখানে Jackson অ্যানোটেশন ব্যবহার করে Complex Object Serialization/Deserialization এর কিছু গুরুত্বপূর্ণ কৌশল আলোচনা করা হবে।
1. Nested Objects Serialization/Deserialization
Nested objects সাধারণত একটি object এর মধ্যে আরেকটি object থাকে। Jackson ডিফল্টভাবে এটি handle করতে পারে, তবে কখনও কখনও আপনি এটি কাস্টমাইজ করতে চান।
উদাহরণ:
public class Address {
private String street;
private String city;
private String zipCode;
// Constructors, Getters, Setters
}
public class User {
private String name;
private int age;
private Address address; // Nested Object
// Constructors, Getters, Setters
}
Serialization Example:
import com.fasterxml.jackson.databind.ObjectMapper;
public class NestedObjectSerialization {
public static void main(String[] args) throws Exception {
Address address = new Address("123 Main St", "Dhaka", "1212");
User user = new User("Rahim", 30, address);
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(user);
System.out.println(json);
}
}
Output:
{
"name": "Rahim",
"age": 30,
"address": {
"street": "123 Main St",
"city": "Dhaka",
"zipCode": "1212"
}
}
2. Using @JsonProperty for Custom Field Naming
@JsonProperty অ্যানোটেশন ব্যবহার করে আপনি Java ফিল্ড এবং JSON ফিল্ডের নামের মধ্যে পার্থক্য রাখতে পারেন।
উদাহরণ:
import com.fasterxml.jackson.annotation.JsonProperty;
public class User {
@JsonProperty("full_name")
private String name;
@JsonProperty("user_age")
private int age;
// Constructors, Getters, Setters
}
Serialization Example:
import com.fasterxml.jackson.databind.ObjectMapper;
public class CustomFieldNaming {
public static void main(String[] args) throws Exception {
User user = new User("Rahim", 30);
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(user);
System.out.println(json);
}
}
Output:
{
"full_name": "Rahim",
"user_age": 30
}
3. Using @JsonIgnore to Ignore Fields
Jackson এর @JsonIgnore অ্যানোটেশন ব্যবহার করে কিছু ফিল্ড Serialization বা Deserialization থেকে বাদ দেওয়া যায়। এটি সাধারণত এমন ক্ষেত্রে ব্যবহৃত হয় যেখানে আপনি কিছু অবজেক্টের প্রপার্টি JSON-এ অন্তর্ভুক্ত করতে চান না।
উদাহরণ:
import com.fasterxml.jackson.annotation.JsonIgnore;
public class User {
private String name;
@JsonIgnore
private int age;
// Constructors, Getters, Setters
}
Serialization Example:
import com.fasterxml.jackson.databind.ObjectMapper;
public class IgnoreFieldExample {
public static void main(String[] args) throws Exception {
User user = new User("Rahim", 30);
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(user);
System.out.println(json);
}
}
Output:
{
"name": "Rahim"
}
4. Handling Bidirectional Relationships with @JsonManagedReference and @JsonBackReference
Bidirectional relationships, বিশেষ করে Parent-Child রিলেশনশিপের ক্ষেত্রে Circular References এড়ানোর জন্য @JsonManagedReference এবং @JsonBackReference ব্যবহার করা হয়। এটি infinite recursion থেকে রক্ষা করে।
উদাহরণ:
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.JsonBackReference;
public class Parent {
private String name;
@JsonManagedReference
private Child child;
// Constructors, Getters, Setters
}
public class Child {
private String name;
@JsonBackReference
private Parent parent;
// Constructors, Getters, Setters
}
Serialization Example:
import com.fasterxml.jackson.databind.ObjectMapper;
public class BidirectionalSerialization {
public static void main(String[] args) throws Exception {
Parent parent = new Parent("Rahim");
Child child = new Child("Rita");
parent.setChild(child);
child.setParent(parent);
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(parent);
System.out.println(json);
}
}
Output:
{
"name": "Rahim",
"child": {
"name": "Rita"
}
}
ব্যাখ্যা:
@JsonManagedReferenceএবং@JsonBackReferenceদিয়ে circular reference সমাধান করা হয়েছে, যেখানেchildফিল্ডের জন্য@JsonManagedReferenceব্যবহার করা হয়েছে এবংparentফিল্ডের জন্য@JsonBackReferenceব্যবহার করা হয়েছে।
5. Polymorphic Serialization with @JsonTypeInfo and @JsonSubTypes
Polymorphic objects serialize করার জন্য @JsonTypeInfo এবং @JsonSubTypes ব্যবহার করা হয়। এই অ্যানোটেশনগুলির মাধ্যমে আপনি Parent-Child inheritance হ্যান্ডেল করতে পারেন।
উদাহরণ:
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonSubTypes;
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = Car.class, name = "car"),
@JsonSubTypes.Type(value = Truck.class, name = "truck")
})
abstract class Vehicle {
private String brand;
// Getters and Setters
}
class Car extends Vehicle {
private int seatingCapacity;
// Getters and Setters
}
class Truck extends Vehicle {
private int loadCapacity;
// Getters and Setters
}
Serialization Example:
import com.fasterxml.jackson.databind.ObjectMapper;
public class PolymorphicSerialization {
public static void main(String[] args) throws Exception {
Vehicle car = new Car();
((Car) car).setSeatingCapacity(5);
((Car) car).setBrand("Toyota");
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(car);
System.out.println(json);
}
}
JSON Output:
{
"type": "car",
"brand": "Toyota",
"seatingCapacity": 5
}
ব্যাখ্যা:
@JsonTypeInfoএবং@JsonSubTypesব্যবহার করে Jackson Polymorphic objects সঠিকভাবে serialize করেছে এবংtypeপ্রপার্টির মাধ্যমে যে subclass হবে তা নির্ধারণ করেছে।
6. Using @JsonFormat for Custom Date and Time Formatting
@JsonFormat অ্যানোটেশন ব্যবহার করে আপনি Date এবং Time ফিল্ডের জন্য কাস্টম ফরম্যাট নির্ধারণ করতে পারেন।
উদাহরণ:
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
public class Event {
private String name;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date eventDate;
// Constructors, Getters, Setters
}
Serialization Example:
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Date;
public class DateFormatSerialization {
public static void main(String[] args) throws Exception {
Event event = new Event();
event.setName("Meeting");
event.setEventDate(new Date());
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(event);
System.out.println(json);
}
}
JSON Output:
{
"name": "Meeting",
"eventDate": "2024-12-21 15:30:00"
}
- Complex Object Serialization/Deserialization এর জন্য Jackson এর অ্যানোটেশন ব্যবহার করে আপনি nested objects, collections, polymorphic types, এবং bidirectional relationships সহজেই manage করতে পারেন।
- Circular Reference সমস্যা সমাধানে
@JsonManagedReferenceএবং@JsonBackReferenceব্যবহার করা হয়। - Polymorphic Serialization এর জন্য
@JsonTypeInfoএবং@JsonSubTypesব্যবহার করা হয়। - Custom Date and Time Formatting এর জন্য
@JsonFormatঅ্যানোটেশন ব্যবহার করা হয়।
Jackson এর এই অ্যানোটেশনগুলো complex data structures কে কার্যকরভাবে serialize এবং deserialize করতে সাহায্য করে, বিশেষত যখন আপনি nested, polymorphic, বা circular relationships নিয়ে কাজ করছেন।
Read more